/**
 * 任务队列类
 * @class taskQueueLimit
 * @author liruilin
 * @date 2025/4/1
 */
class taskQueueLimit {
    /**
     * @param {Object} options - 配置项
     * @param {Number} options.maxTasks - 最大任务数
     * @param {Function} options.complate - 完成回调
     * @param {Boolean} options.debug - 是否开启调试模式，可以看到执行信息
     */
    constructor(options) {
        const { maxTasks, complate, debug } = options || {}; // 获取配置项
        const definConfig = {
            maxTasks: 10, // 最大任务数
            complate: () => {}, // 完成回调
            debug: false // 是否开启调试
        }
        this.complate = complate || definConfig.complate; // 完成回调
        this.maxTasks = maxTasks || definConfig.maxTasks; // 最大任务数
        this.debug = debug || definConfig.debug; 
        this.queue = []; // 任务队列
        this.currentTask = []; // 当前任务
    }
    /**
     * 添加任务到队列
     * @param {Function} task - 任务函数，返回一个 Promise
     */
    addTask(task) {
        if(task.constructor.name !== 'Function') {
            throw new Error('task is not a function');
            return 
        }
        this.queue.push(task);
    }
    /**
     * 开始执行任务
     */
    runNextTask() {
        for (let i = 0; i < this.maxTasks; i++) {
            // 如果队列为空，则退出，不继续添加任务
            if (this.queue.length === 0) {
                break
            }; 
            if (this.currentTask.length >= this.maxTasks) break; // 如果当前任务数超过最大任务数，则退出
            const task = this.queue.shift(); // 取出当前任务
            this.currentTask.push(task);
            this.debug && console.log('添加一个任务，并执行')
            /**
             * finally
             * promise.then或promise.catch执行后立即执行
             * @param {Object} callback
             */
            task.finally = function (callback) {
                let P = this.constructor;
                return this.then(
                    value  => P.resolve(callback()).then(() => value),
                    reason => P.resolve(callback()).then(() => { throw reason })
                );
            }
            task().finally(() => {
                this.taskComplete(task); // 删除当前任务
                this.runNextTask();
            })
        }
    }
    /**
     * 任务完成回调
     * @param {Function} task - 任务函数，返回一个 Promise
     */
     taskComplete(task) {
        this.debug && console.log('%c一个任务执行完成，剩余待执行任务数量：' + this.queue.length, 'color:green');
        this.deleteTask(task)
        
        if (this.queue.length === 0 && this.currentTask.length === 0) {
            this.complate(); // 执行完成回调
        }else {
            this.runNextTask(); // 继续执行下一个任务
        }
        this.debug && console.log('%c当前并发执行任务数量：' + this.currentTask.length, 'color:blue');
    }
    /**
     * 删除当前任务
     * @param {Function} task - 任务函数，返回一个 Promise
     */
    deleteTask(task) {
        const index = this.currentTask.indexOf(task);
        if (index !== -1) {
            this.currentTask.splice(index, 1); // 删除当前任务
        }
    }
}

export default taskQueueLimit